package top.roadvast.rabbitmq.consumer.simple;

import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import lombok.extern.slf4j.Slf4j;
import top.roadvast.rabbitmq.utils.ConnectionUtil;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 简单模式-消费者,手动进行ACK
 */
@Slf4j
public class SimpleRecv2 {
    private final static String QUEUE_NAME = "simple_queue";

    public static void main(String[] arg) throws IOException, TimeoutException {
        // 获取到连接
        // 创建通道
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();
        // 声明队列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        // 监听队列，第二个参数：是否自动进行消息确认。false：不进行自动确认
        // 第三个参数：定义队列的消费者
        channel.basicConsume(QUEUE_NAME, false, new DefaultConsumer(channel) {
            // 获取消息，并且处理，这个方法类似事件监听，如果有消息的时候，会被自动调用
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties,
                                       byte[] body) {
                // body 即消息体
                //当消息没有消费成功（出现异常）队列中的消息不会被删除
//                        int i=1/0;
                String msg = new String(body);
                if (log.isDebugEnabled()) {
                    log.debug(" [x] received : " + msg + "!");
                }
                // 手动进行ACK
                try {
                    channel.basicAck(envelope.getDeliveryTag(), false);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}